νλ‘ νΈμλ μ ν리μΌμ΄μ μμ λΆμ° μ΄λ²€νΈ μμνλ₯Ό μν μ€μκ° λ²‘ν° μκ³ κ΅¬ν λ° μ΄ν΄μ λν μ’ ν© κ°μ΄λμ λλ€. μ¬λ¬ ν΄λΌμ΄μΈνΈμμ μ΄λ²€νΈλ₯Ό λκΈ°ννλ λ°©λ²μ μμ보μΈμ.
νλ‘ νΈμλ μ€μκ° λ²‘ν° μκ³: λΆμ° μ΄λ²€νΈ μμν
μ μ λ μνΈ μ°κ²°λλ μΉ μ ν리μΌμ΄μ μΈκ³μμ μ¬λ¬ ν΄λΌμ΄μΈνΈ κ°μ μΌκ΄λ μ΄λ²€νΈ μμλ₯Ό 보μ₯νλ κ²μ λ°μ΄ν° 무결μ±μ μ μ§νκ³ μνν μ¬μ©μ κ²½νμ μ 곡νλ λ° λ§€μ° μ€μν©λλ€. μ΄λ μ¨λΌμΈ λ¬Έμ νΈμ§κΈ°, μ€μκ° μ±ν νλ«νΌ λ° λ€μ€ μ¬μ©μ κ²μ νκ²½κ³Ό κ°μ νμ μ ν리μΌμ΄μ μμ νΉν μ€μν©λλ€. μ΄λ₯Ό λ¬μ±νλ κ°λ ₯ν κΈ°μ μ λ²‘ν° μκ³λ₯Ό ꡬννλ κ²μ λλ€.
λ²‘ν° μκ³λ 무μμ λκΉ?
λ²‘ν° μκ³λ κΈλ‘λ² λ¬Όλ¦¬μ μκ³μ μμ‘΄νμ§ μκ³ λΆμ° μμ€ν μμ μ΄λ²€νΈμ λΆλΆ μμλ₯Ό κ²°μ νλ λ° μ¬μ©λλ λ Όλ¦¬μ μκ³μ λλ€. ν΄λ‘ λ리ννΈ λ° λκΈ°ν λ¬Έμ μ μ·¨μ½ν 물리μ μκ³μ λ¬λ¦¬ λ²‘ν° μκ³λ μΈκ³Ό κ΄κ³λ₯Ό μΆμ νκΈ° μν μΌκ΄λκ³ μμ μ μΈ λ°©λ²μ μ 곡ν©λλ€.
μ¬λ¬ μ¬μ©μκ° κ³΅μ λ¬Έμμμ νμ νκ³ μλ€κ³ μμν΄ λ³΄μΈμ. κ° μ¬μ©μμ μμ (μ: μ λ ₯, μμ , μμ μ§μ )μ μ΄λ²€νΈλ‘ κ°μ£Όλ©λλ€. λ²‘ν° μκ³λ₯Ό μ¬μ©νλ©΄ 물리μ μμΉλ λ€νΈμν¬ λκΈ° μκ°μ κ΄κ³μμ΄ ν μ¬μ©μμ μμ μ΄ λ€λ₯Έ μ¬μ©μμ μμ μ , ν λλ λμμ λ°μνλμ§ μ¬λΆλ₯Ό νμΈν μ μμ΅λλ€.
μ£Όμ κ°λ
- 벑ν°: κ° νλ‘μΈμ€(μ: μ¬μ©μ λΈλΌμ°μ μΈμ )λ μμ€ν μ νλ‘μΈμ€μ ν΄λΉνλ μμκ° μλ λ°°μ΄ λλ κ°μ²΄μΈ 벑ν°λ₯Ό μ μ§ κ΄λ¦¬ν©λλ€. κ° μμμ κ°μ νμ¬ νλ‘μΈμ€κ° μκ³ μλ ν΄λΉ νλ‘μΈμ€μ λ Όλ¦¬μ μκ°μ λνλ λλ€.
- μ¦κ°: νλ‘μΈμ€κ° λ΄λΆ μ΄λ²€νΈ(ν΄λΉ νλ‘μΈμ€μλ§ λ³΄μ΄λ μ΄λ²€νΈ)λ₯Ό μ€ννλ©΄ 벑ν°μμ μ체 νλͺ©μ μ¦κ°μν΅λλ€.
- μ μ‘: νλ‘μΈμ€κ° λ©μμ§λ₯Ό 보λ΄λ©΄ λ©μμ§μ νμ¬ λ²‘ν° μκ³ κ°μ ν¬ν¨ν©λλ€.
- μμ : νλ‘μΈμ€κ° λ©μμ§λ₯Ό λ°μΌλ©΄ νμ¬ λ²‘ν°μ λ©μμ§μμ λ°μ 벑ν°μ μμλ³ μ΅λκ°μ μ·¨νμ¬ μ체 벑ν°λ₯Ό μ λ°μ΄νΈν©λλ€. λν μμ μ΄λ²€νΈ μ체λ₯Ό λ°μνμ¬ λ²‘ν°μμ μ체 νλͺ©μ *μ¦κ°*μν΅λλ€.
λ²‘ν° μκ³κ° μ€μ λ‘ μλνλ λ°©μ
λ¬Έμμμ νμ νλ μΈ λͺ μ μ¬μ©μ(A, B, C)κ° ν¬ν¨λ κ°λ¨ν μμ λ‘ μ€λͺ ν΄ λ³΄κ² μ΅λλ€.
μ΄κΈ° μν: κ° μ¬μ©μλ λ²‘ν° μκ³λ₯Ό [0, 0, 0]μΌλ‘ μ΄κΈ°νν©λλ€.
μ¬μ©μ Aμ μμ : μ¬μ©μ Aκ° λ¬Έμ 'H'λ₯Ό μ λ ₯ν©λλ€. Aλ 벑ν°μμ μ체 νλͺ©μ μ¦κ°μμΌ [1, 0, 0]μ΄ λ©λλ€.
μ¬μ©μ A μ μ‘: μ¬μ©μ Aλ 'H' λ¬Έμ λ° λ²‘ν° μκ³ [1, 0, 0]μ μλ²λ‘ 보λ΄κ³ μλ²λ μ΄λ₯Ό μ¬μ©μ Bμ Cμκ² λ¦΄λ μ΄ν©λλ€.
μ¬μ©μ B μμ : μ¬μ©μ Bλ λ©μμ§μ λ²‘ν° μκ³ [1, 0, 0]μ μμ ν©λλ€. Bλ μμλ³ μ΅λκ°μ μ·¨νμ¬ λ²‘ν° μκ³λ₯Ό μ λ°μ΄νΈν©λλ€. max([0, 0, 0], [1, 0, 0]) = [1, 0, 0]. κ·Έλ° λ€μ Bλ μ체 νλͺ©μ μ¦κ°μμΌ [1, 1, 0]μ΄ λ©λλ€.
μ¬μ©μ C μμ : μ¬μ©μ Cλ λ©μμ§μ λ²‘ν° μκ³ [1, 0, 0]μ μμ ν©λλ€. Cλ λ²‘ν° μκ³λ₯Ό μ λ°μ΄νΈν©λλ€. max([0, 0, 0], [1, 0, 0]) = [1, 0, 0]. κ·Έλ° λ€μ Cλ μ체 νλͺ©μ μ¦κ°μμΌ [1, 0, 1]μ΄ λ©λλ€.
μ¬μ©μ Bμ μμ : μ¬μ©μ Bκ° λ¬Έμ 'i'λ₯Ό μ λ ₯ν©λλ€. Bλ λ²‘ν° μκ³μμ μ체 νλͺ©μ μ¦κ°μν΅λλ€. [1, 2, 0].
μ΄λ²€νΈ λΉκ΅:
μ΄μ μ΄λ¬ν μ΄λ²€νΈμ κ΄λ ¨λ λ²‘ν° μκ³λ₯Ό λΉκ΅νμ¬ κ΄κ³λ₯Ό νμΈν μ μμ΅λλ€.
- Aμ 'H'([1, 0, 0])λ Bμ 'i'([1, 2, 0])λ³΄λ€ λ¨Όμ λ°μνμ΅λλ€. [1, 0, 0] <= [1, 2, 0]μ΄κ³ μ μ΄λ νλμ μμκ° μ격νκ² μκΈ° λλ¬Έμ λλ€.
λ²‘ν° μκ³ λΉκ΅
λ²‘ν° μκ³ V1κ³Ό V2λ‘ νμλλ λ μ΄λ²€νΈ κ°μ κ΄κ³λ₯Ό νμΈνλ €λ©΄:
- V1μ V2λ³΄λ€ λ¨Όμ λ°μνμ΅λλ€(V1 < V2): V1μ κ° μμλ V2μ ν΄λΉ μμλ³΄λ€ μκ±°λ κ°κ³ , μ μ΄λ νλμ μμκ° μ격νκ² μμ΅λλ€.
- V2λ V1λ³΄λ€ λ¨Όμ λ°μνμ΅λλ€(V2 < V1): V2μ κ° μμλ V1μ ν΄λΉ μμλ³΄λ€ μκ±°λ κ°κ³ , μ μ΄λ νλμ μμκ° μ격νκ² μμ΅λλ€.
- V1κ³Ό V2λ λμμ μ λλ€. V1 < V2λ V2 < V1λ μλλλ€. μ¦, μ΄λ²€νΈ κ°μ μΈκ³Ό κ΄κ³κ° μμ΅λλ€.
- V1κ³Ό V2λ κ°μ΅λλ€(V1 = V2): V1μ κ° μμλ V2μ ν΄λΉ μμμ κ°μ΅λλ€. μ΄λ λ 벑ν°κ° λͺ¨λ λμΌν μνλ₯Ό λνλμ μλ―Έν©λλ€.
νλ‘ νΈμλ JavaScriptμμ λ²‘ν° μκ³ κ΅¬ν
λ€μμ νλ‘ νΈμλ μ ν리μΌμ΄μ μ μ ν©ν JavaScriptμμ λ²‘ν° μκ³λ₯Ό ꡬννλ λ°©λ²μ λν κΈ°λ³Έ μμ λλ€.
class VectorClock {
constructor(processId, totalProcesses) {
this.processId = processId;
this.clock = new Array(totalProcesses).fill(0);
}
increment() {
this.clock[this.processId]++;
}
merge(receivedClock) {
for (let i = 0; i < this.clock.length; i++) {
this.clock[i] = Math.max(this.clock[i], receivedClock[i]);
}
this.increment(); // Increment after merging, representing the receive event
}
getClock() {
return [...this.clock]; // Return a copy to avoid modification issues
}
happenedBefore(otherClock) {
let lessThanOrEqual = true;
let strictlyLessThan = false;
for (let i = 0; i < this.clock.length; i++) {
if (this.clock[i] > otherClock[i]) {
return false; //Not less than or equal
}
if (this.clock[i] < otherClock[i]) {
strictlyLessThan = true;
}
}
return strictlyLessThan && lessThanOrEqual;
}
}
// Example Usage:
const totalProcesses = 3; // Number of collaborating users
const userA = new VectorClock(0, totalProcesses);
const userB = new VectorClock(1, totalProcesses);
const userC = new VectorClock(2, totalProcesses);
userA.increment(); // A does something
const clockA = userA.getClock();
userB.merge(clockA); // B receives A's event
userB.increment(); // B does something
const clockB = userB.getClock();
console.log("A's Clock:", clockA);
console.log("B's Clock:", clockB);
console.log("A happened before B:", userA.happenedBefore(clockB));
μ€λͺ
- μμ±μ: νλ‘μΈμ€ IDμ μ΄ νλ‘μΈμ€ μλ₯Ό μ¬μ©νμ¬ λ²‘ν° μκ³λ₯Ό μ΄κΈ°νν©λλ€. `clock` λ°°μ΄μ λͺ¨λ 0μΌλ‘ μ΄κΈ°νλ©λλ€.
- increment(): νλ‘μΈμ€ IDμ ν΄λΉνλ μΈλ±μ€μμ μκ³ κ°μ μ¦κ°μν΅λλ€.
- merge(): μμλ³ μ΅λκ°μ μ·¨νμ¬ μμ λ μκ³λ₯Ό νμ¬ μκ³μ λ³ν©ν©λλ€. μ΄λ κ² νλ©΄ μκ³κ° κ° νλ‘μΈμ€μ λν΄ μλ €μ§ κ°μ₯ λμ λ Όλ¦¬μ μκ°μ λ°μνλλ‘ λ³΄μ₯λ©λλ€. λ³ν© ν λ©μμ§ μμ μ λνλ΄λ μ체 μκ³λ₯Ό μ¦κ°μν΅λλ€.
- getClock(): μΈλΆ μμ μ λ°©μ§νκΈ° μν΄ νμ¬ μκ³μ 볡μ¬λ³Έμ λ°νν©λλ€.
- happenedBefore(): λ μκ³λ₯Ό λΉκ΅νκ³ νμ¬ μκ³κ° λ€λ₯Έ μκ³λ³΄λ€ λ¨Όμ λ°μν κ²½μ° `true`λ₯Ό λ°ννκ³ κ·Έλ μ§ μμΌλ©΄ `false`λ₯Ό λ°νν©λλ€.
κ³Όμ λ° κ³ λ € μ¬ν
λ²‘ν° μκ³λ λΆμ° μ΄λ²€νΈ μμνλ₯Ό μν κ°λ ₯ν μ루μ μ μ 곡νμ§λ§ κ³ λ €ν΄μΌ ν λͺ κ°μ§ κ³Όμ κ° μμ΅λλ€.
- νμ₯μ±: λ²‘ν° μκ³μ ν¬κΈ°λ μμ€ν μ νλ‘μΈμ€ μμ λ°λΌ μ νμ μΌλ‘ μ¦κ°ν©λλ€. λκ·λͺ¨ μ ν리μΌμ΄μ μμλ μλΉν μ€λ²ν€λκ° λ μ μμ΅λλ€. μλ¦° λ²‘ν° μκ³μ κ°μ κΈ°μ μ μ¬μ©νμ¬ μ΄λ₯Ό μνν μ μμΌλ©°, μ¬κΈ°μ νλ‘μΈμ€μ νμ μ§ν©λ§ μ§μ μΆμ λ©λλ€.
- νλ‘μΈμ€ ID κ΄λ¦¬: κ³ μ ν νλ‘μΈμ€ IDλ₯Ό ν λΉνκ³ κ΄λ¦¬νλ κ²μ΄ μ€μν©λλ€. μ€μ κΈ°κ΄ λλ λΆμ° ν©μ μκ³ λ¦¬μ¦μ μ΄ λͺ©μ μ μ¬μ©ν μ μμ΅λλ€.
- μμ€λ λ©μμ§: λ²‘ν° μκ³λ μμ μ μΈ λ©μμ§ μ λ¬μ κ°μ ν©λλ€. λ©μμ§κ° μμ€λλ©΄ λ²‘ν° μκ³κ° μΌκ΄μ±μ΄ μμ΄μ§ μ μμ΅λλ€. μμ€λ λ©μμ§λ₯Ό κ°μ§νκ³ λ³΅κ΅¬νλ λ©μ»€λμ¦μ΄ νμν©λλ€. λ©μμ§μ μνμ€ λ²νΈλ₯Ό μΆκ°νκ³ μ¬μ μ‘ νλ‘ν μ½μ ꡬννλ κ²κ³Ό κ°μ κΈ°μ μ΄ λμμ΄ λ μ μμ΅λλ€.
- κ°λΉμ§ μμ§/νλ‘μΈμ€ μ κ±°: νλ‘μΈμ€κ° μμ€ν μ λ λλ©΄ λ²‘ν° μκ³μμ ν΄λΉ νλͺ©μ κ΄λ¦¬ν΄μΌ ν©λλ€. νλͺ©μ κ·Έλλ‘ λλ©΄ 벑ν°κ° 무νμ μ»€μ§ μ μμ΅λλ€. νλͺ©μ 'μ£½μ' κ²μΌλ‘ νμ(νμ§λ§ μ¬μ ν μ μ§)νκ±°λ IDλ₯Ό λ€μ ν λΉνκ³ λ²‘ν°λ₯Ό μμΆνλ λ³΄λ€ μ κ΅ν κΈ°μ μ ꡬννλ λ°©λ²μ΄ μμ΅λλ€.
μ€μ μ ν리μΌμ΄μ
λ²‘ν° μκ³λ λ€μκ³Ό κ°μ λ€μν μ€μ μ ν리μΌμ΄μ μμ μ¬μ©λ©λλ€.
- νμ λ¬Έμ νΈμ§κΈ°(μ: Google Docs, Microsoft Office Online): μ¬λ¬ μ¬μ©μμ νΈμ§ λ΄μ©μ΄ μ¬λ°λ₯Έ μμλ‘ μ μ©λλλ‘ νμ¬ λ°μ΄ν° μμμ λ°©μ§νκ³ μΌκ΄μ±μ μ μ§ν©λλ€.
- μ€μκ° μ±ν μ ν리μΌμ΄μ (μ: Slack, Discord): λ©μμ§λ₯Ό μ¬λ°λ₯΄κ² μ λ ¬νμ¬ μΌκ΄λ λν νλ¦μ μ 곡ν©λλ€. μ΄λ λ€λ₯Έ μ¬μ©μκ° λμμ λ³΄λΈ λ©μμ§λ₯Ό μ²λ¦¬ν λ νΉν μ€μν©λλ€.
- λ€μ€ μ¬μ©μ κ²μ νκ²½: μ¬λ¬ νλ μ΄μ΄ κ°μ κ²μ μνλ₯Ό λκΈ°ννμ¬ κ³΅μ μ±μ 보μ₯νκ³ λΆμΌμΉλ₯Ό λ°©μ§ν©λλ€. μλ₯Ό λ€μ΄ ν νλ μ΄μ΄κ° μνν μμ μ΄ λ€λ₯Έ νλ μ΄μ΄μ νλ©΄μ μ¬λ°λ₯΄κ² λ°μλλλ‘ ν©λλ€.
- λΆμ° λ°μ΄ν°λ² μ΄μ€: λΆμ° λ°μ΄ν°λ² μ΄μ€ μμ€ν μμ λ°μ΄ν° μΌκ΄μ±μ μ μ§νκ³ μΆ©λμ ν΄κ²°ν©λλ€. λ²‘ν° μκ³λ₯Ό μ¬μ©νμ¬ μ λ°μ΄νΈμ μΈκ³Ό κ΄κ³λ₯Ό μΆμ νκ³ μ¬λ¬ 볡μ λ³Έμμ μ¬λ°λ₯Έ μμλ‘ μ μ©λλλ‘ ν μ μμ΅λλ€.
- λ²μ μ μ΄ μμ€ν : λΆμ° νκ²½μμ νμΌ λ³κ²½ μ¬νμ μΆμ ν©λλ€(μ’ μ’ λ 볡μ‘ν μκ³ λ¦¬μ¦μ΄ μ¬μ©λμ§λ§).
λ체 μ루μ
λ²‘ν° μκ³λ κ°λ ₯νμ§λ§ λΆμ° μ΄λ²€νΈ μμνλ₯Ό μν μ μΌν μ루μ μ μλλλ€. λ€λ₯Έ κΈ°μ μ λ€μκ³Ό κ°μ΅λλ€.
- λν¬νΈ νμμ€ν¬ν: κ° μ΄λ²€νΈμ λ¨μΌ λ Όλ¦¬μ νμμ€ν¬νλ₯Ό ν λΉνλ λ κ°λ¨ν μ κ·Ό λ°©μμ λλ€. κ·Έλ¬λ λν¬νΈ νμμ€ν¬νλ μ 체 μμλ§ μ 곡νλ©° λͺ¨λ κ²½μ°μ μΈκ³Ό κ΄κ³λ₯Ό μ ννκ² λ°μνμ§ λͺ»ν μ μμ΅λλ€.
- λ²μ 벑ν°: λ²‘ν° μκ³μ μ μ¬νμ§λ§ λ°μ΄ν°λ² μ΄μ€ μμ€ν μμ λ°μ΄ν°μ λ€λ₯Έ λ²μ μ μΆμ νλ λ° μ¬μ©λ©λλ€.
- OT(μ΄μ λ³ν): νμ νΈμ§ νκ²½μμ μΌκ΄μ±μ 보μ₯νκΈ° μν΄ μμ μ λ³ννλ λ 볡μ‘ν κΈ°μ μ λλ€. OTλ μ’ μ’ λ²‘ν° μκ³ λλ κΈ°ν λμμ± μ μ΄ λ©μ»€λμ¦κ³Ό ν¨κ» μ¬μ©λ©λλ€.
- CRDT(μΆ©λ μλ 볡μ λ°μ΄ν° μ ν): μ‘°μ¨μ΄ νμ μμ΄ μ¬λ¬ λ Έλμμ 볡μ λλλ‘ μ€κ³λ λ°μ΄ν° ꡬ쑰μ λλ€. CRDTλ μ΅μ’ μΌκ΄μ±μ 보μ₯νλ©° νμ μ ν리μΌμ΄μ μ νΉν μ ν©ν©λλ€.
νλ μμν¬(React, Angular, Vue)λ‘ κ΅¬ν
React, Angular λ° Vueμ κ°μ νλ‘ νΈμλ νλ μμν¬μ λ²‘ν° μκ³λ₯Ό ν΅ν©νλ €λ©΄ κ΅¬μ± μμ μλͺ μ£ΌκΈ° λ΄μμ μκ³ μνλ₯Ό κ΄λ¦¬νκ³ νλ μμν¬μ λ°μ΄ν° λ°μΈλ© κΈ°λ₯μ νμ©νμ¬ UIλ₯Ό μ μ νκ² μ λ°μ΄νΈν΄μΌ ν©λλ€.
React μμ (κ°λ μ )
import React, { useState, useEffect } from 'react';
function CollaborativeEditor() {
const [text, setText] = useState('');
const [vectorClock, setVectorClock] = useState(new VectorClock(0, 3)); // Assuming process ID 0
const handleTextChange = (event) => {
vectorClock.increment();
const newClock = vectorClock.getClock();
const newText = event.target.value;
// Send newText and newClock to the server
setText(newText);
setVectorClock(newClock); //Update react state
};
useEffect(() => {
// Simulate receiving updates from other users
const receiveUpdate = (incomingText, incomingClock) => {
vectorClock.merge(incomingClock);
setText(incomingText);
setVectorClock(vectorClock.getClock());
}
//Example of how you might receive data, this would likely be handled by a websocket or similar.
//receiveUpdate("New Text from another user", [2,1,0]);
}, []);
return (
<div>
<textarea value={text} onChange={handleTextChange} />
</div>
);
}
export default CollaborativeEditor;
νλ μμν¬ ν΅ν©μ μν μ£Όμ κ³ λ € μ¬ν
- μν κ΄λ¦¬: νλ μμν¬μ μν κ΄λ¦¬ λ©μ»€λμ¦(μ: Reactμ `useState`, Angularμ μλΉμ€, Vueμ λ°μν μμ±)μ νμ©νμ¬ λ²‘ν° μκ³μ μ ν리μΌμ΄μ λ°μ΄ν°λ₯Ό κ΄λ¦¬ν©λλ€.
- λ°μ΄ν° λ°μΈλ©: λ°μ΄ν° λ°μΈλ©μ νμ©νμ¬ λ²‘ν° μκ³ λλ μ ν리μΌμ΄μ λ°μ΄ν°κ° λ³κ²½λ λ UIλ₯Ό μλμΌλ‘ μ λ°μ΄νΈν©λλ€.
- λΉλκΈ° ν΅μ : WebSockets λλ HTTP μμ²μ μ¬μ©νμ¬ μλ²μμ λΉλκΈ° ν΅μ μ μ²λ¦¬νμ¬ μ λ°μ΄νΈλ₯Ό 보λ΄κ³ λ°μ΅λλ€.
- μ΄λ²€νΈ μ²λ¦¬: μ΄λ²€νΈλ₯Ό μ¬λ°λ₯΄κ² μ²λ¦¬ν©λλ€(μ: μ¬μ©μ μ λ ₯, μμ λ©μμ§) λ²‘ν° μκ³μ μ ν리μΌμ΄μ λ°μ΄ν°λ₯Ό μ λ°μ΄νΈν©λλ€.
κΈ°λ³Έ μ¬ν κ·Έ μ΄μ: κ³ κΈ λ²‘ν° μκ³ κΈ°μ
λ 볡μ‘ν μλ리μ€μ κ²½μ° λ€μκ³Ό κ°μ κ³ κΈ κΈ°μ μ κ³ λ €νμμμ€.
- μΆ©λ ν΄κ²°μ μν λ²μ 벑ν°: λ°μ΄ν°λ² μ΄μ€μμ λ²μ 벑ν°(λ²‘ν° μκ³μ λ³ν)λ₯Ό μ¬μ©νμ¬ μΆ©λνλ μ λ°μ΄νΈλ₯Ό κ°μ§νκ³ ν΄κ²°ν©λλ€.
- μμΆμ ν΅ν λ²‘ν° μκ³: νΉν λκ·λͺ¨ μμ€ν μμ λ²‘ν° μκ³μ ν¬κΈ°λ₯Ό μ€μ΄κΈ° μν΄ μμΆ κΈ°μ μ ꡬνν©λλ€.
- νμ΄λΈλ¦¬λ μ κ·Ό λ°©μ: μ΅μ μ μ±λ₯κ³Ό μΌκ΄μ±μ λ¬μ±νκΈ° μν΄ λ²‘ν° μκ³λ₯Ό λ€λ₯Έ λμμ± μ μ΄ λ©μ»€λμ¦(μ: μ΄μ λ³ν)κ³Ό κ²°ν©ν©λλ€.
κ²°λ‘
μ€μκ° λ²‘ν° μκ³λ λΆμ° νλ‘ νΈμλ μ ν리μΌμ΄μ μμ μΌκ΄λ μ΄λ²€νΈ μμνλ₯Ό λ¬μ±νκΈ° μν μ μ©ν λ©μ»€λμ¦μ μ 곡ν©λλ€. λ²‘ν° μκ³μ κΈ°λ³Έ μ리λ₯Ό μ΄ν΄νκ³ κ³Όμ μ μ μΆ©μ μ μ μ€νκ² κ³ λ €ν¨μΌλ‘μ¨ κ°λ°μλ μνν μ¬μ©μ κ²½νμ μ 곡νλ κ°λ ₯νκ³ νμ μ μΈ μΉ μ ν리μΌμ΄μ μ ꡬμΆν μ μμ΅λλ€. κ°λ¨ν μ루μ λ³΄λ€ λ³΅μ‘νμ§λ§ λ²‘ν° μκ³μ κ°λ ₯ν νΉμ±μΌλ‘ μΈν΄ μ μΈκ³ λΆμ° ν΄λΌμ΄μΈνΈ κ°μ λ°μ΄ν° μΌκ΄μ±μ 보μ₯ν΄μΌ νλ μμ€ν μ μ΄μμ μ λλ€.